草庐IT

c++ - RAII 和 C++ STL

全部标签

c++ - 为什么STL中List的迭代器使用的是(*node).data而不是node->data?

最近在看SGISTL的源码。我想知道我是否可以使用“->”运算符替换(*node).data来实现operator*(),如下所示:referenceoperator*()const{return(*node).data;}替换为:referenceoperator*()const{returnnode->data;}此外:node是一个指向结构对象的指针,如下所示:templatestruct__list_node{typedefvoid*void_pointer;void_pointerprev;void_pointernext;Tdata;}; 最佳答

c++ - 如何 "inherit"来自 STL 类的迭代器?

我正在尝试使用我编写的一些算法创建一个名为tableaux的对象类,它们本质上是无符号整数vector的vector(它们类似于矩阵,只是行的长度可以不同)。主要问题是我想从vector类继承这些对象的迭代器,但我不知道如何做。我看了几个相关的问题和答案,我很容易继承std::vector>公开的,但共识是,由于STL容器没有虚拟析构函数或其他原因,这是不好的。所以我决定尝试通过组合来“继承”。这是我要实现的目标的一个最小示例:#include#includeclasstableau{private:std::vector>rep;public:usingstd::vector>::i

c++ - 如何在我的 iPhone 应用程序中使用 C++ STL 容器?

我想在我的iPhone应用程序中使用一个STL集(它是在XCode中用Objective-C编写的)。如何包含设置和/或使用标准命名空间?在C++中我会这样做:#includeusingnamespacestd;//usethesetsomewheredownhere...我如何在Objective-C中执行此操作? 最佳答案 只需重命名您的源文件,使其以.mm结尾,它就会触发Objective-C++前端;然后你可以在其中混合使用Objective-C和C++。更多信息here. 关于

c++ - STL map 和 set 中的排序顺序

用户定义的对象在map和set中是如何排序的?据我所知,map/set是SortedAssociativeContainers:被插入的元素根据其持有的键进行排序。但是map和set在内部使用operator>对它们的元素进行排序。在SGI站点上,我有以下示例:structltstr{booloperator()(constchar*s1,constchar*s2)const{returnstrcmp(s1,s2)months;months["january"]=31;months["february"]=28;months["march"]=31;months["april"]=30

c++ - 在 STL vector 中管理作用域和对象生命周期

来自C#世界,我正在努力确保我不会在分配给我的C++项目中引入内存泄漏和错误。我正在编写使用结构从数据缓冲区解析信息的代码。由于缓冲区中出现的数据结构的数量在运行时可能会发生变化,因此使用STLvector来存储处理后的数据。我在现有软件中遇到了以下代码块,并且正在努力理解其工作原理:MyVectorOfObjects.clear();for(unsigned__int8i=0;i我的问题具体是:根据thisquestion,难道parserObject不会在每次迭代时超出范围,因为没有使用new关键字吗?显然这段代码一直有效。在这种情况下,将对象放在vector中是否会使parser

c++ - 在哪里可以找到有关 C++/STL 方法异常保证的信息?

前几天我正在编写带有异常处理的代码,我有一些关于异常、它们的保证和可抛出的问题。基本上,假设您有:classX{stringm_str;X():m_str("foo")//whatifthisthrows?{ifstreamb("a.in")//whatifthisthrows?}在浏览了我能找到的所有文章之后,我仍然不知道处理这个问题的简洁方法是什么。假设我有这样的代码:{...XmyInstanceOfClassX;...}我应该将代码包装在catch(exception&)中吗?如果我这样做,string和ifstream是否能提供强有力的保证,即没有资源泄漏,也没有任何内容被半

c++ - 毫无异常(exception)地处理 STL 错误

我有一个经常使用STL的项目。现在我正在努力将项目移植到不支持异常的特定平台。我可以禁用异常,但我仍然需要处理STL错误。是否有任何方法可以在禁用异常的情况下正确处理STL错误?是否有任何第三方STL实现对此有帮助? 最佳答案 采用现有标准库容器并在禁用异常的情况下进行编译的问题在于,标准容器接口(interface)本身假定启用了异常。使用异常,如果operatornew无法获取内存,它将抛出异常,否则operatornew将返回0,std容器无法处理。一种方法是只使用STL算法+vector。您可以使用它复制其他容器大约95%的

c++ - STL 的高性能替代品?

传统的STL有哪些缓存友好的高性能替代品。它们应该针对现代64位Intel/AMDCPU的缓存进行优化。我不是在寻找基于官方标准的STL实现,它可以基于它或者是具有高性能数据结构的扩展STL。或者只是一个提供通用数据结构(如列表、map等)的库。高并发和无锁数据结构将是一个奖励。我对链接和许可证感兴趣。我读过有关EASTL的资料,之前也使用过Boost。目前,游戏开发人员和科学界正在使用什么来充分利用CPU?管道中有什么? 最佳答案 +1代表EASTL。由于移动语义,任何基于C++11兼容编译器的东西都可能表现得更好。使用-std=

c++ - 不区分大小写的 STL 容器(例如 std::unordered_set)

制作std::unordered_setCASE-INSENSITIVE容器的最短、最跨平台的方法是什么?my_set.insert("Apples");my_set.insert("apples");//Insertdoesn'toccurbecauseofduplicateitem我知道STL提供了Hash和Pred。Hash应该是什么?Pred应该是什么?如果它们不是内置的,那么请提供它们的代码以及它们的使用示例(即我如何声明std::unordered_set?)。由于批评,我将详细说明我正在尝试做的事情。我需要一个高性能的透明HTTP代理服务器,它所做的其中一件事就是快速查找

c++ - 在具有 move 语义的 RAII 类中,默认构造函数应该做什么?

move语义非常适合RAII类。它们允许人们像拥有值(value)语义一样进行编程,而无需付出大量复制的代价。一个很好的例子是returningstd::vectorfromafunction.然而,使用值语义编程意味着,人们会期望类型表现得像原始数据类型。这两个方面有时似乎是矛盾的。一方面,在RAII中,人们会期望默认构造函数返回一个完全初始化的对象,或者如果资源获取失败则抛出异常。这保证了任何构造的对象都将处于有效且一致的状态(即可以安全使用)。另一方面,对于move语义,当对象位于validbutunspecifiedstate中时存在一个点.同样,原始数据类型可以处于未初始化状